package io.vertx.test.codegen;
import io.vertx.codegen.Helper;
import org.junit.Test;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import static org.junit.Assert.*;
/**
* @author <a href="http://tfox.org">Tim Fox</a>
*/
public class HelperTest {
@Test
public void testGetEmptyPackageName() {
assertEquals("", Helper.getPackageName("SomeClass"));
}
@Test
public void testExtractCommentTags() {
String comment =
" Interface comment line 1\n" +
" Interface comment line 2\n" +
" Interface comment line 3\n\n" +
" @author <a href=\"http://tfox.org\">Tim Fox</a>\n" +
" @version 12.2\n" +
" @see io.vertx.codegen.testmodel.TestInterface\n";
String tagVal = Helper.getJavadocTag(comment, "@author");
assertEquals("<a href=\"http://tfox.org\">Tim Fox</a>", tagVal);
tagVal = Helper.getJavadocTag(comment, "@version");
assertEquals("12.2", tagVal);
tagVal = Helper.getJavadocTag(comment, "@see");
assertEquals("io.vertx.codegen.testmodel.TestInterface", tagVal);
}
@Test
public void removeTags1() {
String comment =
" Interface comment line 1\n" +
" Interface comment line 2\n" +
" Interface comment line 3\n\n" +
" @author <a href=\"http://tfox.org\">Tim Fox</a>\n" +
" @version 12.2\n" +
" @see io.vertx.codegen.testmodel.TestInterface\n";
String removed = Helper.removeTags(comment);
String removedExpected =
" Interface comment line 1\n" +
" Interface comment line 2\n" +
" Interface comment line 3\n";
assertEquals(removedExpected, removed);
}
@Test
public void removeTags2() {
String comment =
" @author <a href=\"http://tfox.org\">Tim Fox</a>\n" +
" @version 12.2\n" +
" @see io.vertx.codegen.testmodel.TestInterface\n";
String removed = Helper.removeTags(comment);
String removedExpected = "";
assertEquals(removedExpected, removed);
}
@Test
public void removeTags3() {
String comment =
" @author <a href=\"http://tfox.org\">Tim Fox</a>\n" +
" @version 12.2\n" +
" @see io.vertx.codegen.testmodel.TestInterface\n";
String removed = Helper.removeTags(comment);
String removedExpected = "";
assertEquals(removedExpected, removed);
}
@Test
public void removeTags4() {
String comment =
"X\n" +
" @author <a href=\"http://tfox.org\">Tim Fox</a>\n" +
" @version 12.2\n" +
" @see io.vertx.codegen.testmodel.TestInterface\n";
String removed = Helper.removeTags(comment);
String removedExpected = "X";
assertEquals(removedExpected, removed);
}
@Test
public void testResolveClassSignature() throws Exception {
Utils.assertProcess((processingEnv, roundEnv) -> {
TypeElement elt = (TypeElement) Helper.resolveSignature(processingEnv.getElementUtils(), processingEnv.getTypeUtils(),
null, "java.lang.Class");
assertEquals(ElementKind.CLASS, elt.getKind());
assertEquals("java.lang.Class", elt.getQualifiedName().toString());
elt = (TypeElement) Helper.resolveSignature(processingEnv.getElementUtils(), processingEnv.getTypeUtils(),
null, "Class");
assertEquals(ElementKind.CLASS, elt.getKind());
assertEquals("java.lang.Class", elt.getQualifiedName().toString());
});
}
@Test
public void testResolveFieldSignature() throws Exception {
Utils.assertProcess((processingEnv, roundEnv) -> {
Element elt = Helper.resolveSignature(processingEnv.getElementUtils(), processingEnv.getTypeUtils(),
null, "java.util.Locale#FRENCH");
assertEquals(ElementKind.FIELD, elt.getKind());
VariableElement varElt = (VariableElement) elt;
TypeElement typeElt = (TypeElement) varElt.getEnclosingElement();
assertEquals("java.util.Locale", typeElt.getQualifiedName().toString());
assertEquals("FRENCH", varElt.getSimpleName().toString());
});
}
private void assertSignature(ProcessingEnvironment processingEnv, String signature, String className, String methodName, String... parameterTypes) {
assertSignature(processingEnv, null, signature, className, methodName, parameterTypes);
}
private void assertSignature(ProcessingEnvironment processingEnv, TypeElement declaringElt, String signature, String className, String methodName, String... parameterTypes) {
Element elt = Helper.resolveSignature(processingEnv.getElementUtils(), processingEnv.getTypeUtils(), declaringElt, signature);
assertEquals(ElementKind.METHOD, elt.getKind());
ExecutableElement methodElt = (ExecutableElement) elt;
TypeElement typeElt = (TypeElement) methodElt.getEnclosingElement();
assertEquals(className, typeElt.getQualifiedName().toString());
assertEquals(methodName, methodElt.getSimpleName().toString());
assertEquals(parameterTypes.length, methodElt.getParameters().size());
for (int i = 0;i < parameterTypes.length;i++) {
assertEquals(parameterTypes[i], methodElt.getParameters().get(i).asType().toString());
}
}
@Test
public void testResolveMethodSignature() throws Exception {
Utils.assertProcess((processingEnv, roundEnv) -> {
assertSignature(processingEnv, "java.util.Locale#createConstant", "java.util.Locale", "createConstant", "java.lang.String", "java.lang.String");
assertSignature(processingEnv, "java.util.Locale#createConstant(String,String)", "java.util.Locale", "createConstant", "java.lang.String", "java.lang.String");
assertSignature(processingEnv, "java.util.Locale#createConstant(java.lang.String,java.lang.String)", "java.util.Locale", "createConstant", "java.lang.String", "java.lang.String");
assertSignature(processingEnv, "java.util.List#containsAll", "java.util.List", "containsAll", "java.util.Collection<?>");
assertSignature(processingEnv, "java.util.List#containsAll(Collection)", "java.util.List", "containsAll", "java.util.Collection<?>");
assertSignature(processingEnv, "java.util.List#containsAll(java.util.Collection)", "java.util.List", "containsAll", "java.util.Collection<?>");
assertSignature(processingEnv, "java.util.List#get", "java.util.List", "get", "int");
assertSignature(processingEnv, "java.util.List#get(int)", "java.util.List", "get", "int");
assertSignature(processingEnv, "java.util.List#toArray(Object[])", "java.util.List", "toArray", "T[]");
});
}
@Test
public void testResolveRelativeMethodSignature() throws Exception {
Utils.assertProcess((processingEnv, roundEnv) -> {
TypeElement localeElt = processingEnv.getElementUtils().getTypeElement("java.util.Locale");
TypeElement listElt = processingEnv.getElementUtils().getTypeElement("java.util.List");
assertSignature(processingEnv, localeElt, "#createConstant", "java.util.Locale", "createConstant", "java.lang.String", "java.lang.String");
assertSignature(processingEnv, localeElt, "#createConstant(String,String)", "java.util.Locale", "createConstant", "java.lang.String", "java.lang.String");
assertSignature(processingEnv, localeElt, "#createConstant(java.lang.String,java.lang.String)", "java.util.Locale", "createConstant", "java.lang.String", "java.lang.String");
assertSignature(processingEnv, listElt, "#containsAll", "java.util.List", "containsAll", "java.util.Collection<?>");
assertSignature(processingEnv, listElt, "#containsAll(Collection)", "java.util.List", "containsAll", "java.util.Collection<?>");
assertSignature(processingEnv, listElt, "#containsAll(java.util.Collection)", "java.util.List", "containsAll", "java.util.Collection<?>");
assertSignature(processingEnv, listElt, "#get", "java.util.List", "get", "int");
assertSignature(processingEnv, listElt, "#get(int)", "java.util.List", "get", "int");
assertSignature(processingEnv, listElt, "#parallelStream()", "java.util.Collection", "parallelStream");
});
}
@Test
public void testUnresolveSignatures() throws Exception {
Utils.assertProcess((processingEnv, roundEnv) -> {
String[] signatures = {
"java.util.Locale#createConstant(int,String)",
};
for (String signature : signatures) {
Element elt = Helper.resolveSignature(processingEnv.getElementUtils(), processingEnv.getTypeUtils(), null, signature);
assertNull(elt);
}
});
}
}